home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-Sensation: Golden Games / Amiga CD-Sensation - Ausgabe 2 - Golden Games (1996)(GTI - Schatztruhe)(DE)[!].iso / Brain Activity / Minen / minen.c < prev    next >
C/C++ Source or Header  |  1992-07-08  |  20KB  |  653 lines

  1. /*===================================================*
  2.   This code is freeware !    You don't have to pay a
  3.   penny for it. No restrictions are made of any kind.
  4.   Nevertheless: Please keep the code working and re-
  5.   distribute the program together with the source.
  6.   Try a fair play with this lines. If you feel a bit
  7.   guilty when playing without paying  send an amount
  8.   of useful things (-: may include money ;-) to:
  9.         Andreas Neuper
  10.         ++49 +921 64278 (data)
  11.         ++49 +921 62440 (voice/answering machine)
  12.         2:2400/80.33    (fido)
  13.         andreas.neuper@iris6.uni-bayreuth.de (internet)
  14.         Emil-Warburg-Weg 34  8580 Bayreuth (yellowmail)
  15.         no responsibility is taken     (no blackmail !)
  16.  *===================================================*/
  17.  
  18. /*###################################################*
  19.   TO FIX
  20.    * distinguish between chipmem and fastmem parts
  21.    * include doc file
  22.    * single step bomb amount prop gadget
  23.       (actual commented lines haven't satisfied the author)
  24.    * finer icons
  25.   BUG REPORT:
  26.     * fixed dim-16 borderbomb bug
  27.     * screen colour moderated to grey
  28.     * tightened wbstartupcode
  29.     * play on after aim is reached
  30.     * Gridsize 0 cancelled (guru)
  31.   ADDITIONS:
  32.     * added mark on right mousebutton
  33.     * added mark of last selected field
  34.     * enlarged to gridsize 17
  35.   VERSION 1.0
  36.     * full key/numboard support
  37.     * full mouse support
  38.     * 4 colour screen
  39.     * very fast except new game
  40.     * title line for comments
  41.     * full workbench support
  42.     * full cli support
  43.     * variable size 1 -- 256 fields
  44.     * variable bomb amount ( higher than percolation )
  45.     * 3 languages available
  46.     * source and makefile included
  47.     * no copyright or other restrictions
  48.     * no responsibility (perfectly hidden viruses ß-)
  49.  *###################################################*/
  50.  
  51. /*-------------------Makefile------------------------*
  52. # ©1992 JAN Andreas Neuper --- ANSI C  AMIGA KS 1.3
  53. # Version V1.01            08.07.1992
  54. # Language-selection:
  55. #   minen           ---    erzeuge deutschen Code
  56. #   mines           ---    generate english Code
  57. #   minas           ---    procrea codigó español
  58. minen: minen.o
  59.     ln +q -o minen +cdb minen.o -lcl
  60.  
  61. mines: mines.o
  62.     ln +q -o mines +cdb mines.o -lcl
  63.  
  64. minas: minas.o
  65.     ln +q -o minas +cdb minas.o -lcl
  66.  
  67. minen.o: minen.c
  68.     cc -md -o minen.o minen.c
  69.  
  70. mines.o: minen.c
  71.     cc -md -DENGLISH -o mines.o minen.c
  72.  
  73. minas.o: minen.c
  74.     cc -md -DESPANOL -o minas.o minen.c
  75.  *------------------AZTEC-5.0a-----------------------*/
  76. #include <stdio.h>
  77. #include <time.h>
  78. #include <exec/types.h>
  79. #include <ctype.h>
  80. #include <string.h>
  81. #include <stdlib.h>
  82. #include <intuition/intuition.h>
  83. #include <libraries/dosextens.h>
  84. #include <clib/reqbase.h>
  85. #include <graphics/view.h>
  86. #include <workbench/workbench.h>
  87. #include <workbench/startup.h>
  88. #include <workbench/icon.h>
  89. #include <functions.h>
  90. #define MAXMAX  17
  91.  
  92. int    bomben[MAXMAX][MAXMAX];
  93. int    besuch[MAXMAX][MAXMAX];
  94. int    xsize=36, xoffset=20;
  95. int    ysize=18, yoffset=20;
  96. int    bombs=20,max=10; /*bombs global wg. workbenchstartup*/
  97. void *IconBase;
  98.  
  99. void    _wb_parse(prozess,wbm)
  100. register struct Process *prozess;
  101. struct WBStartup *wbm;
  102. {    register struct DiskObject *diskobj;
  103.     register    struct WBArg *arglist;
  104.     register    char *str;
  105.  
  106.     arglist = wbm->sm_ArgList;
  107.     arglist++;
  108.     if((arglist->wa_Name)[0]==0)    --arglist;
  109.     CurrentDir((struct FileLock *)arglist->wa_Lock);
  110.     if ((IconBase = OpenLibrary("icon.library", 0L)) == 0)    return;
  111.     if ((diskobj = GetDiskObject(arglist->wa_Name)) == 0)    goto close_icon_lib;
  112.     if (str = FindToolType(diskobj->do_ToolTypes, "BOMB"))
  113.         if(atoi(str)>0) bombs=atoi(str);
  114.     if (str = FindToolType(diskobj->do_ToolTypes, "DIM"))
  115.         if(atoi(str)>0) max=atoi(str);
  116.     FreeDiskObject(diskobj);
  117. close_icon_lib:
  118.     CloseLibrary(IconBase);
  119.     IconBase = 0;
  120.     return;
  121. }
  122.  
  123. struct RastPort    *rp;
  124. struct Window    *window;
  125. struct Screen    *screen;
  126. struct Gadget Gadgets[MAXMAX][MAXMAX];
  127. struct IntuiText nummer[MAXMAX*MAXMAX];
  128. char    ziffer[MAXMAX*MAXMAX][2];
  129. SHORT Gadget_pairs0[] = { 0,0,0,14,1,14,1,0,29,0 };
  130. SHORT Gadget_pairs1[] = { 1,14,29,14,29,1,30,0,30,14 };
  131. SHORT Mark_pairs[] = { -3,-2, -3,14, 30,14, 30,-2, -3,-2 };
  132. #define CONTAINER 145
  133.  
  134. struct Border Gadget_umark[] = {
  135.   0,0,0,0,JAM2,5,(SHORT *)&Mark_pairs,&Gadget_umark[1],
  136.   1,0,0,0,JAM2,5,(SHORT *)&Mark_pairs,NULL };
  137.  
  138. struct Border Gadget_mark[] = {
  139.   0,0,2,1,JAM2,5,(SHORT *)&Mark_pairs,&Gadget_mark[1],
  140.   1,0,2,1,JAM2,5,(SHORT *)&Mark_pairs,NULL };
  141.  
  142. struct Border Gadget_bord[] = {
  143.   0,0,1,0,JAM1,5,(SHORT *)&Gadget_pairs0,&Gadget_bord[1],
  144.   0,0,3,0,JAM1,5,(SHORT *)&Gadget_pairs1,NULL };
  145.  
  146. SHORT G_pairs0[] = { 0,0,0,28,1,28,1,0,147,0 };
  147. SHORT G_pairs1[] = { 1,28,147,28,147,1,148,0,148,28 };
  148.  
  149. struct Border G_bord[] = {
  150.   0,0,1,0,JAM1,5,(SHORT *)&G_pairs0,&G_bord[1],
  151.   0,0,3,0,JAM1,5,(SHORT *)&G_pairs1,NULL };
  152.  
  153. SHORT B_pairs0[] = { 0,0,0,14,1,14,1,0,147,0 };
  154. SHORT B_pairs1[] = { 1,14,147,14,147,1,148,0,148,14 };
  155.  
  156. struct Border B_bord[] = {
  157.   0,0,1,0,JAM1,5,(SHORT *)&B_pairs0,&B_bord[1],
  158.   0,0,3,0,JAM1,5,(SHORT *)&B_pairs1,NULL };
  159.  
  160. struct Gadget PGadget = {
  161.   NULL,40,10,31,15,GADGHNONE,
  162.   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,
  163.   (APTR)&Gadget_bord[0],NULL,
  164.   NULL,(BPTR)NULL,(APTR)NULL,0,NULL };
  165.  
  166. struct PropInfo BombG_info = {
  167.   PROPBORDERLESS|FREEHORIZ,0x0100,0x0100,0x0100,0x0100,0,0,0,0,0,0 };
  168.  
  169. USHORT Knopf[]={
  170.   0xCCCC, 0x6666, 0x3333, 0x9999,
  171.   0xCCCC, 0x6666, 0x3333, 0x9999,
  172.   0xCCCC, 0x6666, 0x3333, 0x9999,
  173.   0xCCCC, 0x6666, 0x3333, 0x9999
  174.  };
  175.  
  176. struct Image BombG_image = {
  177.   0,0,16,13,1,&Knopf[0],0x01,0x00,NULL };
  178.  
  179. #ifdef ESPANOL
  180. UBYTE nbomb[]  = "Nº de bombas:   ";
  181. UBYTE nbombf[] = "Nº de bombas:%3d";
  182. #elif ENGLISH
  183. UBYTE nbomb[]  = " Nº of bombs:   ";
  184. UBYTE nbombf[] = " Nº of bombs:%3d";
  185. #else
  186. UBYTE nbomb[]  = "Bombenanzahl:   ";
  187. UBYTE nbombf[] = "Bombenanzahl:%3d";
  188. #endif
  189.  
  190. struct IntuiText BombG_text = {
  191.   1,0,JAM2,12,21,NULL,nbomb,NULL };
  192.  
  193. struct Gadget BombG = {
  194.   &(Gadgets[0][0]),473,121,CONTAINER,13,
  195.   GADGHNONE|GADGIMAGE,RELVERIFY,PROPGADGET,
  196.   (APTR)&BombG_image,NULL,
  197.   &BombG_text,(BPTR)NULL,(APTR)&BombG_info,1002,NULL };
  198.  
  199. struct Image GridG_image = {
  200.   0,0,16,13,1,&Knopf[0],0x01,0x00,NULL };
  201.  
  202. struct PropInfo GridG_info = {
  203.   PROPBORDERLESS|FREEHORIZ,0x8000,0x8000,0x1000,0x0800,0,0,0,0,0,0 };
  204.  
  205. #ifdef ESPANOL
  206. UBYTE ngrid[]  = " dimensión :   ";
  207. UBYTE ngridf[] = " dimensión :%3d";
  208. #elif ENGLISH
  209. UBYTE ngrid[]  = "  Gridsize :   ";
  210. UBYTE ngridf[] = "  Gridsize :%3d";
  211. #else
  212. UBYTE ngrid[]  = "Gittergröße:   ";
  213. UBYTE ngridf[] = "Gittergröße:%3d";
  214. #endif
  215.  
  216. struct IntuiText GridG_text = {
  217.   1,0,JAM2,16,21,NULL,ngrid,NULL };
  218.  
  219. struct Gadget GridG = {
  220.   &BombG,473,161,CONTAINER,13,
  221.   GADGHNONE|GADGIMAGE,RELVERIFY,PROPGADGET,
  222.   (APTR)&GridG_image,NULL,
  223.   &GridG_text,(BPTR)NULL,(APTR)&GridG_info,1003,NULL };
  224.  
  225. struct IntuiText NewG_text = {
  226. #ifdef ESPANOL
  227.   1,0,JAM1,30,11,NULL,(UBYTE *)"Juego Nuevo",NULL };
  228. #elif ENGLISH
  229.   1,0,JAM1,42,11,NULL,(UBYTE *)"New Game",NULL };
  230. #else
  231.   1,0,JAM1,30,11,NULL,(UBYTE *)"Neues Spiel",NULL };
  232. #endif
  233.  
  234. struct Gadget NewG = {
  235.   &GridG,471,71,149,29,
  236.   GADGHCOMP,RELVERIFY|GADGIMMEDIATE,BOOLGADGET,
  237.   (APTR)&G_bord[0],NULL,
  238.   &NewG_text,(BPTR)NULL,NULL,1001,NULL };
  239.  
  240. struct IntuiText QuitG_text = {
  241. #ifdef ESPANOL
  242.   1,0,JAM1,41,11,NULL,(UBYTE *)"Terminar",NULL };
  243. #elif ENGLISH
  244.   1,0,JAM1,57,11,NULL,(UBYTE *)"Quit",NULL };
  245. #else
  246.   1,0,JAM1,45,11,NULL,(UBYTE *)"Beenden",NULL };
  247. #endif
  248.  
  249. struct Gadget QuitG = {
  250.   &NewG,471,21,149,29,
  251.   GADGHCOMP,RELVERIFY|GADGIMMEDIATE,BOOLGADGET,
  252.   (APTR)&G_bord[0],NULL,
  253.   &QuitG_text,(BPTR)NULL,NULL,1000,NULL };
  254.  
  255. #ifdef ESPANOL
  256. UBYTE titel[]=(UBYTE*)"                                "
  257.                              "  M I N A S    "
  258.                              "                                ";
  259. #elif ENGLISH
  260. UBYTE titel[]=(UBYTE*)"                                "
  261.                              "  M I N E S    "
  262.                              "                                ";
  263. #else
  264. UBYTE titel[]=(UBYTE*)"                                "
  265.                              "  M I N E N    "
  266.                              "                                ";
  267. #endif
  268.  
  269. struct NewScreen ns = {
  270.   0,0,640,276,2,1,0,HIRES,CUSTOMSCREEN,NULL,NULL,NULL,NULL };
  271.  
  272. struct IntuiText copy_text = {
  273.   1,0,JAM1,0,0,NULL,(UBYTE *)"©1992 JAN",NULL };
  274.  
  275. struct NewWindow mainframe = {
  276.   0,10,640,246,1,2,GADGETDOWN|GADGETUP|MENUPICK|RAWKEY,
  277.   NOCAREREFRESH|SMART_REFRESH|BACKDROP|ACTIVATE|BORDERLESS,
  278.   &QuitG,NULL,titel,NULL,NULL,150,40,640,276,CUSTOMSCREEN };
  279.  
  280. struct    IntuitionBase    *IntuitionBase;
  281. struct    GfxBase            *GfxBase;
  282. struct    IntuiMessage    *message;
  283. struct    Message            *GetMsg();
  284. struct    Gadget            *GadgetPtr;
  285. ULONG     MessageClass;
  286. USHORT    code;
  287.  
  288. void    init_gadget_array(int n)
  289. {    int    i,j;
  290.  
  291.     xsize=440/n;
  292.     ysize=((xsize+1)>>1);
  293.     Gadget_pairs0[3]=Gadget_pairs0[5]=Gadget_pairs1[1]=Gadget_pairs1[3]=Gadget_pairs1[9]=ysize-4;
  294.     Gadget_pairs0[8]=Gadget_pairs1[2]=Gadget_pairs1[4]=xsize-7;
  295.     Gadget_pairs1[6]=Gadget_pairs1[8]=xsize-6;
  296.     Mark_pairs[3] = Mark_pairs[5] = ysize-2;
  297.     Mark_pairs[4] = Mark_pairs[6] = xsize-4;
  298.     for(i=0;i<n;i++)
  299.     {    for(j=0;j<n;j++)
  300.         {    (Gadgets[i][j]).TopEdge  = yoffset + ysize * i;
  301.             (Gadgets[i][j]).LeftEdge = xoffset + xsize * j;
  302.             (Gadgets[i][j]).Width = xsize-6;
  303.             (Gadgets[i][j]).Height = ysize-3;
  304.             (Gadgets[i][j]).Flags = PGadget.Flags;
  305.             (Gadgets[i][j]).Activation = PGadget.Activation;
  306.             (Gadgets[i][j]).GadgetType = PGadget.GadgetType;
  307.             (Gadgets[i][j]).GadgetRender = PGadget.GadgetRender;
  308.             (Gadgets[i][j]).SelectRender = PGadget.SelectRender;
  309.             (Gadgets[i][j]).GadgetText = &nummer[i+j*n];
  310.                 nummer[i+j*n].IText=(UBYTE*)ziffer[i+j*n];
  311.                 nummer[i+j*n].FrontPen=1;
  312.                 nummer[i+j*n].BackPen=0;
  313.                 nummer[i+j*n].DrawMode=JAM2;
  314.                 nummer[i+j*n].LeftEdge=(xsize>>1)-6;
  315.                 nummer[i+j*n].TopEdge =(ysize>>1)-5;
  316.                 nummer[i+j*n].ITextFont=NULL;
  317.                 nummer[i+j*n].NextText=NULL;
  318.             (Gadgets[i][j]).GadgetID = i + j * n;
  319.             (Gadgets[i][j]).NextGadget = ((j+1)!=(n))?&(Gadgets[i][j+1]):&(Gadgets[i+1][0]);
  320.         }
  321.     }    (Gadgets[n-1][n-1]).NextGadget = (struct    Gadget *)NULL;
  322.     return;
  323. }
  324.  
  325. void  close_all(int end_value)
  326. {  extern void CloseLibrary();
  327.    extern void CloseWindow();
  328.  
  329.    if (screen)        CloseScreen(screen);
  330.    if (window)        CloseWindow(window);
  331.    if (GfxBase)       CloseLibrary(GfxBase);
  332.    if (IntuitionBase) CloseLibrary(IntuitionBase);
  333.    if (end_value)         fprintf(stderr,"EXIT: %d\n",end_value);
  334.    exit(end_value);
  335. }
  336.  
  337. void    reopenwindow(int n)
  338. {    extern struct  Window   *OpenWindow();
  339.  
  340.    if (window)        CloseWindow(window);
  341.     init_gadget_array(n);
  342.    if (!(window = (struct Window *) OpenWindow(&mainframe))) close_all(217);
  343.     rp = window->RPort;
  344.     SetDrMd(rp,JAM2);  /* Drawmode:  ÜBERSCHREIBEN  setzen  */
  345.     SetAPen(rp,1); /* Farbregister zum Zeichnen setzen  */
  346.     DrawBorder(rp,B_bord,471,120);
  347.     DrawBorder(rp,B_bord,471,160);
  348.     PrintIText(rp,©_text,540,228);
  349.     return;
  350. }
  351.  
  352. void    open_all(void)
  353. {    void                    *OpenLibrary();
  354.     extern struct  Window   *OpenWindow();
  355.  
  356.    if (!(GfxBase = (struct GfxBase *)
  357.       OpenLibrary("graphics.library", (long)0)))
  358.       close_all(204);
  359.  
  360.    if (!(IntuitionBase = (struct IntuitionBase *)
  361.       OpenLibrary("intuition.library", (long)0)))
  362.       close_all(205);
  363.  
  364.    if (!(screen = (struct Screen *) OpenScreen(&ns))) close_all(206);
  365.     SetRGB4(&screen->ViewPort,0,0x7,0x7,0x7);
  366.     SetRGB4(&screen->ViewPort,1,0xE,0xE,0xE);
  367.     SetRGB4(&screen->ViewPort,2,0x0,0x0,0x0);
  368.     SetRGB4(&screen->ViewPort,3,0x2,0x2,0xD);
  369.     mainframe.Screen = screen;
  370.    if (!(window = (struct Window *) OpenWindow(&mainframe))) close_all(207);
  371.     (void) SetTaskPri(FindTask((char *) 0), 1) ;
  372.  
  373.     Delay(5L);
  374.     rp = window->RPort;
  375.     SetDrMd(rp,JAM2);  /* Drawmode:  ÜBERSCHREIBEN  setzen  */
  376.     SetAPen(rp,1); /* Farbregister zum Zeichnen setzen  */
  377.     DrawBorder(rp,B_bord,471,120);
  378.     DrawBorder(rp,B_bord,471,160);
  379.     PrintIText(rp,©_text,540,228);
  380.     return;
  381. }
  382.  
  383. int    wie_viele(int    x,int    y)
  384. {    int    b=0;
  385.  
  386.     if(x>0 &&   y>0   && bomben[x-1][y-1]) b++;
  387.     if(x>0 && y+1<max && bomben[x-1][y+1]) b++;
  388.     if(y>0 && x+1<max && bomben[x+1][y-1]) b++;
  389.     if(x>0 && bomben[x-1][y]) b++;
  390.     if(y>0 && bomben[x][y-1]) b++;
  391.     if(x+1<max && y+1<max && bomben[x+1][y+1]) b++;
  392.     if(x+1<max && bomben[x+1][y]) b++;
  393.     if(y+1<max && bomben[x][y+1]) b++;
  394.     return(b);
  395. }
  396.  
  397. int    erlaubt(int    x,int    y)
  398. {    int    b=0;
  399.  
  400.     if(x>0 && y>0 && besuch[x-1][y-1]) b++;
  401.     if(x>0 && besuch[x-1][y+1]) b++;
  402.     if(y>0 && besuch[x+1][y-1]) b++;
  403.     if(x>0 && besuch[x-1][y]) b++;
  404.     if(y>0 && besuch[x][y-1]) b++;
  405.     if(besuch[x+1][y+1]) b++;
  406.     if(besuch[x+1][y]) b++;
  407.     if(besuch[x][y+1]) b++;
  408.     if(x==0&&y==0)
  409.     {    SetWindowTitles(window,(char*)titel,
  410. #ifdef ESPANOL
  411.             "¡Empieza! Hasta la casilla abajo a la derecha."
  412.             "Lee la quantidad de minas.");
  413. #elif ENGLISH
  414.             "Go to the lower right Edge ! "
  415.             "The digit tells you howmany bombs are around.");
  416. #else
  417.             "Zur rechten unteren Ecke ! "
  418.             "Die Zahl sagt Dir wieviel Minen Dich umgeben.");
  419. #endif
  420.         b++;
  421.     }
  422.     return(b);
  423. }
  424.  
  425. void    init_bomben(int    n)
  426. {    int i,j;
  427.     time_t timer;
  428.  
  429.     for(i=0;i<MAXMAX;i++)
  430.     {    for(j=0;j<MAXMAX;j++)
  431.         {    bomben[i][j]=0;
  432.             besuch[i][j]=0;
  433.             ziffer[i+j*MAXMAX][0]=' ';
  434.     }    }
  435.     SetWindowTitles(window,(char*)titel,
  436. #ifdef ESPANOL
  437.         "¡ Empieza ! con la casilla arriba a la izquierda. ");
  438. #elif ENGLISH
  439.         "Come on, make your mind up and play !     Upper left square !");
  440. #else
  441.         "Komm und fang endlich an !     Das Feld oben links !");
  442. #endif
  443.     time(&timer);
  444.     srand((unsigned int)timer);
  445.     for(i=0;i<n;i++)
  446.     {    if( bomben[rand()%max][rand()%max]++ ) i--;
  447.     }
  448.     RefreshGadgets(&Gadgets[0][0],window,NULL);
  449.     Delay(5L);
  450.     return;
  451. }
  452.  
  453. #define MAXBOMB (max*max)
  454.  
  455. int    main(int argc, char *argv[])
  456. {    int    warten=TRUE,stop=FALSE,what=1;
  457.     int    x = -1,y = -1,gameover=FALSE,oldmax=max;
  458.  
  459.     if(argc>3||argv[1][0]=='?'||argv[1][0]=='h'||argv[1][1]=='?'||argv[1][1]=='h')
  460. #ifdef ESPANOL
  461.     {    printf("\nSINTAXIS:  %s  <#bombas>  <#dimensión>\n\n",argv[0]);
  462. #elif ENGLISH
  463.     {    printf("\nSYNOPSIS:  %s  <#bombs>  <#dimension>\n\n",argv[0]);
  464. #else
  465.     {    printf("\nSYNTAX:  %s  <#bomben>  <#gitterdimension>\n\n",argv[0]);
  466. #endif
  467.         exit(0);
  468.     }
  469.     if(argc>1)    { oldmax=atoi(argv[1]); if(oldmax>0) bombs=oldmax; oldmax = max; }
  470.     if(argc>2)    { oldmax=atoi(argv[2]); if(oldmax>0) max=oldmax; else oldmax=max;  }
  471.     init_gadget_array(max);
  472.     if(CONTAINER<bombs) bombs=CONTAINER;
  473. /*    BombG_info.HorizPot = (bombs*MAXPOT)/((MAXBOMB>CONTAINER)?CONTAINER:MAXBOMB);
  474.               Damit Einzelschritte moeglioch werden, statt der nächsten Zeile
  475. */    BombG_info.HorizPot = (bombs*MAXPOT)/(MAXBOMB);
  476.     GridG_info.HorizPot = ((max-1)*MAXPOT) /(MAXMAX-1);
  477.     sprintf((char*)nbomb,(char*)nbombf,bombs);
  478.     sprintf((char*)ngrid,(char*)ngridf,max);
  479.     open_all();
  480.     do
  481.     {    init_bomben(bombs);
  482.         stop=FALSE;
  483.         warten=TRUE;
  484.         Delay(5L);
  485.         do
  486.         {    Wait(1 << window -> UserPort -> mp_SigBit);
  487.             while (message = (struct IntuiMessage *) GetMsg(window->UserPort))
  488.             {  code = message->Code;
  489.                 MessageClass = message->Class;
  490.                 ReplyMsg((struct Message *)message);
  491.                 GadgetPtr = (struct Gadget *) (message->IAddress);
  492.                 what=0;
  493.                 switch(MessageClass)
  494.                 {    case RAWKEY:
  495.                     {    what=1;
  496.                         if(code<0x60)
  497.                             DrawBorder(rp,Gadget_umark,x*xsize+xoffset,y*ysize+yoffset);
  498.                         switch(code)
  499.                         {    case 0x3D:    x--;    y--;    break;
  500.                             case 0x4C:
  501.                             case 0x3E:    y--;    break;
  502.                             case 0x3F:    x++;    y--;    break;
  503.                             case 0x4F:
  504.                             case 0x2D:    x--;    break;
  505.                             case 0x4E:
  506.                             case 0x2F:    x++;    break;
  507.                             case 0x1D:    x--;    y++;    break;
  508.                             case 0x4D:
  509.                             case 0x1E:    y++;    break;
  510.                             case 0x1F:    x++;    y++;    break;
  511.                             case 0x10:
  512.                             case 0x45:    GadgetPtr->GadgetID = 1000;    what=2;    break;
  513.                             case 0x44:
  514.                             case 0x5F:
  515.                             case 0x36:    GadgetPtr->GadgetID = 1001;    what=2;    break;
  516.                             default:    what=0;
  517.                         } if(!what) break;
  518.                         if(x<0) x=0;
  519.                         if(x>=max) x=max;
  520.                         if(y<0) y=0;
  521.                         if(y>=max) y=max;
  522.                         if(what!=2)    GadgetPtr->GadgetID = y+x*max;
  523.                     }
  524.                     case GADGETDOWN:
  525.                   {
  526.                         DrawBorder(rp,Gadget_umark,x*xsize+xoffset,y*ysize+yoffset);
  527.                         if(GadgetPtr->GadgetID > 999)
  528.                         {    switch(GadgetPtr->GadgetID)
  529.                             {    case 1000: /*QUIT*/
  530.                                     warten = FALSE;
  531.                                     stop = TRUE;
  532.                                     break;
  533.                                case 1001: /*NEU*/
  534.                                    if(oldmax!=max)
  535.                                    {    oldmax=max;
  536.                                        reopenwindow(max);
  537.                                    }
  538.                                     x = y = -1;
  539.                                     warten = FALSE;
  540.                                     stop = FALSE;
  541.                                     gameover=FALSE;
  542.                                     break;
  543.                                 case 1002: /*BOMBEN*/
  544.                                     break;
  545.                                 case 1003: /*GITTER*/
  546.                                     break;
  547.                                 default:
  548.                                     {    warten = FALSE;    stop = TRUE;    }
  549.                             } break;
  550.                         } else if(gameover)    DisplayBeep(screen);
  551.                         if(!gameover)
  552.                         {    y=(GadgetPtr->GadgetID)%max;
  553.                             x=(GadgetPtr->GadgetID)/max;
  554.                             if(!erlaubt(x,y)) break;
  555.                             besuch[x][y] = TRUE;
  556.                             DrawBorder(rp,Gadget_mark,x*xsize+xoffset,y*ysize+yoffset);
  557.                             if(bomben[x][y])
  558.                             {    gameover=TRUE;
  559.                                 ziffer[(GadgetPtr->GadgetID)][0] = '*';
  560.                                 DisplayBeep(screen);
  561. #ifdef ESPANOL
  562.                                 SetWindowTitles(window,(char*)titel,"¡ Ofendas te a una mina !");
  563. #elif ENGLISH
  564.                                 SetWindowTitles(window,(char*)titel,"Your last step - A Bomb detonated !");
  565. #else
  566.                                 SetWindowTitles(window,(char*)titel,"Voll draufgetreten !");
  567. #endif
  568.                             } else
  569.                             ziffer[(GadgetPtr->GadgetID)][0] = wie_viele(x,y)+'0';
  570.  
  571.                             PGadget.NextGadget = Gadgets[y][x].NextGadget;
  572.                             Gadgets[y][x].NextGadget = NULL;
  573.                             RefreshGadgets(&Gadgets[y][x],window,NULL);
  574.                             Gadgets[y][x].NextGadget = PGadget.NextGadget;
  575.                             if(x+1==max && y+1==max && !gameover)
  576. #ifdef ESPANOL
  577.                             {    SetWindowTitles(window,(char*)titel,"¡ Congratulatiónes !  Muy bien.");
  578. #elif ENGLISH
  579.                             {    SetWindowTitles(window,(char*)titel,"Congratulations ! You\'ve succeeded !");
  580. #else
  581.                             {    SetWindowTitles(window,(char*)titel,"Gratulation ! Du hast es geschafft !");
  582. #endif
  583. /*                                gameover=TRUE;*/
  584.                             }
  585.                         }    break;
  586.                     }
  587.                    case GADGETUP:
  588.                         {    switch(GadgetPtr->GadgetID)
  589.                             {    case 1002: /*BOMB*/
  590.                                     gameover=TRUE;
  591.                                     SetWindowTitles(window,(char*)titel,
  592. #ifdef ESPANOL
  593.                                     "¡ Debes a empezar un juego nuevo !");
  594. #elif ENGLISH
  595.                                     "  Now you have to start a new game !");
  596. #else
  597.                                     "Jetzt muß ein neues Spiel begonnen werden !");
  598. #endif
  599. /*                                    bombs = (((MAXBOMB>CONTAINER)?CONTAINER:MAXBOMB)
  600.                                           * BombG_info.HorizPot)/MAXPOT;
  601.           Damit Einzelschritte moeglioch werden, statt der nächsten Zeile
  602. */                                    bombs = (MAXBOMB * BombG_info.HorizPot)/MAXPOT;
  603.                                     sprintf((char*)nbomb,(char*)nbombf,bombs);
  604.                                     PGadget.NextGadget = BombG.NextGadget;
  605.                                     BombG.NextGadget = NULL;
  606.                                     RefreshGadgets(&BombG,window,NULL);
  607.                                     BombG.NextGadget = PGadget.NextGadget;
  608.                                     break;
  609.                                 case 1003: /*GRID*/
  610.                                     gameover=TRUE;
  611.                                     SetWindowTitles(window,(char*)titel,
  612. #ifdef ESPANOL
  613.                                     "  ¡ Debes a comenzar un juego nuevo !");
  614. #elif ENGLISH
  615.                                     "  Initialize a new game !");
  616. #else
  617.                                     "  Es muß ein neues Spiel gestartet werden !");
  618. #endif
  619.                                     max = ((MAXMAX-1)*GridG_info.HorizPot)/MAXPOT+1;
  620.                                     sprintf((char*)ngrid,(char*)ngridf,max);
  621. /*                                    bombs = (((CONTAINER>=MAXBOMB)?MAXBOMB:CONTAINER)
  622.                                           * BombG_info.HorizPot)/MAXPOT;
  623.         Damit Einzelschritte moeglioch werden, statt der nächsten Zeile
  624. */                                    bombs = (MAXBOMB * BombG_info.HorizPot)/MAXPOT;
  625.                                     sprintf((char*)nbomb,(char*)nbombf,bombs);
  626.                                     PGadget.NextGadget = BombG.NextGadget;
  627.                                     BombG.NextGadget = NULL;
  628.                                     RefreshGadgets(&GridG,window,NULL);
  629.                                     BombG.NextGadget = PGadget.NextGadget;
  630.                                     break;
  631.                                 default:
  632.                                     ;
  633.                             }                
  634.                         }    break;                  
  635.                         case MENUPICK:
  636.                         {    int    xtmp=(window->MouseX-xoffset)/xsize,
  637.                                     ytmp=(window->MouseY-yoffset)/ysize;
  638.                             if(xtmp>=max||ytmp>=max||x<0||y<0)    break;
  639.                             ziffer[ytmp+xtmp*max][0] =
  640.                                 ('X'==ziffer[ytmp+xtmp*max][0])?' ':'X';
  641.                             PGadget.NextGadget = Gadgets[ytmp][xtmp].NextGadget;
  642.                             Gadgets[ytmp][xtmp].NextGadget = NULL;
  643.                             RefreshGadgets(&Gadgets[ytmp][xtmp],window,NULL);
  644.                             Gadgets[ytmp][xtmp].NextGadget = PGadget.NextGadget;
  645.                         }    break;                  
  646.                 }
  647.             }
  648.         }     while(warten);
  649.     }    while(!stop);
  650.     close_all(0);
  651.     return(0);
  652. }
  653.